import axios from 'axios'
import promise from 'es6-promise'
promise.polyfill()
import router from '@/router'
import { Notification, MessageBox } from 'element-ui'
// 创建axios实例
const Axios = axios.create({
  baseURL: 'http://localhost:8000',
   baseURL: 'http://server.shudais.com:8000',
  // baseURL: 'https://api.daidaihu365.com',
  timeout: 15000 // 请求超时时间
})

// 添加请求拦截器
Axios.interceptors.request.use(config => {
  config.headers['Authorization'] = 'Bearer ' + (sessionStorage.token || '')
  // config.headers['Channel'] = '100001'
  // config.headers['Device'] = '2b421e88-f3e8-f9db-ac92-c649ef2bde8f'
  // config.headers['Source'] = 'wap'
  // config.headers['System'] = '1.0.0'
  // config.headers['Version'] = '2.0.0'
  // 在发送请求之前做些什么
  return config
}, error => {
  // 对请求错误做些什么
  console.log(error)
  return Promise.reject(error)
})

// token过期处理
Axios.interceptors.response.use(response => {
  // 对响应数据做点什么
  return response
}, error => {
    let code = 0
    try {
      code = error.response.data.status
    } catch (e) {
      if (error.toString().indexOf('Error: timeout') !== -1) {
        Notification.error({
          title: '网络请求超时',
          duration: 2500
        })
        return Promise.reject(error)
      }
      if (error.toString().indexOf('Error: Network Error') !== -1) {
        Notification.error({
          title: '网络请求错误',
          duration: 2500
        })
        return Promise.reject(error)
      }
    }
    if (code === 401) {
        MessageBox.confirm(
          '登录状态已过期，您可以继续留在该页面，或者重新登录',
          '系统提示',
          {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }
        ).then(() => {
            location.reload() // 为了重新实例化vue-router对象 避免bug
        })
      } else if (code === 403) {
        router.push({ path: '/401' })
      } else {
        const errorMsg = error.response.data.message
        if (errorMsg !== undefined) {
          Notification.error({
            title: errorMsg,
            duration: 2500
          })
        }
      }
  return Promise.reject(error)
})
// $http 第一层拦截
function $http(url, data, method = `get`, cb,er) {
  console.log(method)
  switch (method) {
    case 'get':
      Axios.get(url, data.params ? data : {params: data}).then(res => {
        doCode(res)
      }).catch(err=>{
        errCode(err)
      })
      break
    case 'post':
      Axios.post(url, data).then(res => {
        doCode(res)
      }).catch(err=>{
        errCode(err)
      })
      break
    case 'put':
      Axios.put(url, data).then(res => {
        console.log('resresres')
        doCode(res)
      }).catch(err=>{
        console.log(err)
        errCode(err)
      })
      break
    default:
  }
  function doCode (res) {
    console.log(res)
    switch (res.status) {
      case 401:
        getToken(url, data, method, cb,er)
        break
      default: if (cb && typeof cb === 'function') cb(res.data)
    }
  }
  function errCode (err) {
      if (er && typeof er === 'function') er(err.response.data)
  }
}
// 获取token
function getToken (url, data, method = `get`, cb, er) {
  Axios.get('/api/v1/token').then(tk => {
    if (tk.code === 200) {
      sessionStorage.token = tk.data.token
      $http(url, data, method, cb)
    } else {
      getToken(url, data, method, cb)
    }
  })
}

// 发起请求
export default $http
